package enumDemo;

/**
 * 一、枚举类的使用
 * 1. 枚举类的理解：类的对象只有有限个，且是确定的。
 * 2. 如果需要定义**一组**常量，建议使用枚举类
 * 3. 如果枚举类中只有一个对象，则可以作为单例模式的实现方式
 * <p>
 * 二、定义枚举类
 * jdk5.0之前，自定义类==>作为枚举类
 * jdk5.0后，使用enum关键字自定义枚举类
 */
public class EnumDemo {
    public static void main(String[] args) {
        // enum的toString已经被重写，不再是打印地址
        System.out.println(Season2.SPRING);
        // 默认继承于java.lang.Enum
        System.out.println(Season2.class.getSuperclass());
    }
}

// 自定义枚举类
class Season {
    // 1. 声明Season对象属性 private final
    private final String seasonName;    // 确定的！使用final
    private final String seasonDesc;

    // 2. 私有化构造器
    private Season(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    // 3. 提供当前枚举类的多个对象
    public static final Season SPRING = new Season("春天", "春暖花开");
    public static final Season SUMMER = new Season("夏天", "夏日炎炎");

    // 4. 其他诉求：获取枚举类对象的属性

    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

// 1.5 之后使用关键字enum（推荐使用）
// 字段默认就是 public static final，无需要显示写出
enum Season2 {
    // 提供当前枚举类的对象
    // 多个对象之间逗号隔开，末尾;结束
    SPRING("春天", "春暖花开"),
    SUMMER("夏天", "夏日炎炎");


    // 每一个对象中的属性
    private final String seasonName;
    private final String seasonDesc;

    private Season2(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}